package com.example.springbootredis.service;

import com.example.springbootredis.dao.ProductDao;
import com.example.springbootredis.pojo.Product;
import jakarta.annotation.PostConstruct;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: 19239
 * @Description:
 * @Date: 2024/5/10
 * @Version: 1.0
 */
@Service
public class ProductService {

    @Autowired
    RedissonClient redissonClient;

    @Autowired
    private ProductDao productDao;

    private RBloomFilter<Integer> bloomFilter = null;

    public ResponseEntity<Object> getProduct(int productId) {
        // bloomFilter中不存在该key,为非法访问
        if (!bloomFilter.contains(productId)) {
            System.out.println("所要查询的数据既不在缓存中，也不在数据库中，为非法key");
            return new ResponseEntity<>("所要查询的数据既不在缓存中，也不在数据库中，为非法key", HttpStatusCode.valueOf(200));
        }
        // 不是非法访问，可以访问数据库
        System.out.println("数据库中得到数据*****");
        return new ResponseEntity<>(productDao.getProductAll(), HttpStatusCode.valueOf(200));

    }

    /**
     * 初始化布隆过滤器
     */
    @PostConstruct
    public void initProduct() {
        // 启动项目时初始化bloomFilter
        List<Product> productList = productDao.getProductAll();
        //参数：布隆过滤器的名字
        bloomFilter = redissonClient.getBloomFilter("userFilter");
        // 初始化布隆过滤器  预计数据量   误判率
        bloomFilter.tryInit(1000L, 0.01);
        for (Product product : productList) {
            bloomFilter.add(product.getId());
        }
    }

    /**
     * 新增产品添加布隆过滤器
     *
     * @param product
     */
    public void addProduct(Product product) {
        productDao.addProduct(product);
        bloomFilter.add(product.getId());
    }
}
